package com.link510.nbiot.cmcc.domain.commands;

import com.alibaba.fastjson.annotation.JSONField;
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
import com.link510.nbiot.cmcc.config.Config;
import com.link510.nbiot.cmcc.domain.BaseDTO;
import com.link510.nbiot.cmcc.helper.UnixTimeHelper;
import lombok.*;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;

/**
 * 发送命令
 *
 * @author cqnews
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CacheCommandDTO implements BaseDTO {

    private static final long serialVersionUID = 8974039914108304592L;

    /**
     * 设备imei号，平台唯一，必填参数
     */
    @Builder.Default
    private String imei = "";

    /**
     * 设备的object id，根据终端设备sdk确定
     */
    @JSONField(name = "obj_id")
    @Builder.Default
    private Integer objId = 3200;

    /**
     * nbiot设备object下具体的一个实例id,根据终端设备sdk确定
     */
    @JSONField(name = "obj_inst_id")
    @Builder.Default
    private Integer objInstId = 0;


    /**
     * nbiot设备的资源id,根据终端设备sdk确定
     */
    @JSONField(name = "res_id")
    @Builder.Default
    private Integer resId = 0;

    /**
     * 命令字符串，大小限制2k
     */
    @Builder.Default
    private String args = "";

    /**
     * 命令开始生效时间戳，可选（不填时默认为OneNET当前时间）
     */
    @Builder.Default
    private String validTime = "";


    /**
     * 命令过期时间戳，必须大于valid_time
     */
    @Builder.Default
    private Integer expiredTime = 0;

    /**
     * [0 10]之间，表示失败重试次数（等待下一次设备update或者上线），默认为3
     */
    @Builder.Default
    private Integer retry = 3;

    /**
     * 过期时间，填写时必须在[25,40]之间；不填写默认为25
     */
    @Builder.Default
    private Integer timeout = 25;

    /**
     * 命令触发的上行消息类型，填写时必须在[1,7]之间；不填写默认为7
     */
    @Builder.Default
    private Integer triggerMsg = 7;

    /**
     * 转url
     *
     * @return 返回url
     */
    @Override
    public String toUrl() {

        StringBuilder url = new StringBuilder(Config.getApiUrl());

        url.append("/nbiot").append("/execute").append("/offline");
        url.append("?imei=").append(this.imei);
        url.append("&obj_id=").append(this.objId);
        url.append("&obj_inst_id=").append(this.objInstId);
        url.append("&res_id=").append(this.resId);

        if (!Strings.isNullOrEmpty(this.validTime)) {
            url.append("&valid_time=").append(this.validTime.replace(" ", "T"));
        }

        url.append("&expired_time=").append(covertExpiredTime(this.expiredTime));

        if (retry >= 0 && retry <= 10 && retry != 3) {
            url.append("&retry=").append(this.retry);
        }

        if (timeout > 25 && timeout <= 40) {
            url.append("&timeout=").append(this.timeout);
        }

        if (triggerMsg >= 1 && triggerMsg < 7) {
            url.append("&trigger_msg=").append(this.triggerMsg);
        }

        System.out.println(url);

        return url.toString();
    }

    /**
     * 转成想要的时间格式,中间带T
     * @param expiredTime 超时时间 秒
     * @return
     */
    private String covertExpiredTime(Integer expiredTime) {

        Calendar calendar = Calendar.getInstance();

        calendar.setTimeInMillis(expiredTime * 1000);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        return sdf.format(calendar.getTime()).replace(" ", "T");
    }

    @Override
    public Map<String, Object> toMaps() {
        Map<String, Object> maps = Maps.newHashMap();
        maps.put("args", args);
        return maps;
    }
}
